﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
''' <summary>
''' Bewegt eine Einheit von einem Feld zu einem anderen
''' </summary>
''' <remarks></remarks>
Public Class ObjektLaufen
    Implements ICloneable
    Shared ZählerZahl As Integer = 4
    Dim Start As Boolean = False
    Public Falle As Boolean = False
    Dim Zähler As Integer = 0
    Dim Richtung As Richtungen
    Dim Bildgröße As Rectangle
    Public Zielerreicht As Boolean = False
    Dim Fertigelaufen As Boolean = False
    Enum Richtungen
        Unten
        Oben
        Rechts
        Links
    End Enum
    Dim Einheit As ObjektEinheit
    Dim WegX() As Integer
    Dim WegY() As Integer
    Public Position As Point
    Dim Laufpunk As Point
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="neuEinheit"></param>
    ''' <param name="neuWegX">Mit dem Startpunkt wird in der Tine gelöscht</param>
    ''' <param name="neuWegY">Mit dem Startpunkt wird in der Tine gelöscht</param>
    ''' <param name="neuPosition">In Feldern wird in der Tine Hochgerechnet</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal neuEinheit As ObjektEinheit, ByVal neuWegX() As Integer, ByVal neuWegY() As Integer, ByVal neuPosition As Point)
        Objektverwalter.MarkierteFelder.Clear()
        Objektverwalter.Spielfeld.EingabenErlauben = False
        Einheit = neuEinheit
        WegX = neuWegX
        WegY = neuWegY
        Array.Resize(WegX, WegX.Length - 1)
        Array.Resize(WegY, WegX.Length)
        Position = neuPosition
        Laufpunk.X = Position.X * Hauptmenü.Feldbreite
        Laufpunk.Y = Position.Y * Hauptmenü.Feldbreite
        Bildgröße.Size = Objektverwalter.AlleEinheiten(neuEinheit.BildID).GetBildgröße(Einheit.GetSpieler.Armee)
        Start = True
        If My.Settings.draw3D Then
            'Die 3D-Animation sollte nicht vergessen werden!
            Einheit.AnimPos = 0
            ZählerZahl = 12
        Else
            ZählerZahl = 4
        End If
        '     Laufen()
    End Sub
    Public Sub Einheitmalen()
        If Start = True Then
            If Einheit.Sichtbar Then
                If My.Settings.draw3D Then
                    Grafikengine.Sprite.End()
                    ObjektLadeklasse.Einheit3D.Malen(Einheit.EinheitenID, Laufpunk.X / Hauptmenü.Feldbreite, Laufpunk.Y / Hauptmenü.Feldbreite, Einheit.GetMap, Einheit.Spieler, Einheit.Rotation, False, "Walk", Einheit.AnimPos, Einheit.AnimPeriode)
                    Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
                    If Einheit.AnimPos >= Einheit.AnimPeriode Then
                        Einheit.AnimPos = 0 'Die Animation sollte jedesmal wieder von vorne anfangen.
                    End If
                Else
                    If Objektverwalter.Spielfeld.Landschaften(Position.X, Position.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus Or Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Regeln.LetzterMensch).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Or Not Einheit.IsGetarnt(Objektverwalter.Spielfeld.Regeln.LetzterMensch) Then
                        'Welchen Teil des Bildes wir malen wollen
                        Dim sngRotation As Double = 0
                        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                        'prüfen ob wir aus den Screenbereich laufen

                        'Festlegen welchen Bereich vom Bitmap wir kopieren

                        'Welcher Teil der Textur soll gemalt werden Nichts bedeutet gesamtes Bild

                        With Grafikengine.recBild
                            .X = Bildgröße.Width * Einheit.Frame : .Width = Bildgröße.Width
                            .Y = Bildgröße.Height * Richtung : .Height = Bildgröße.Height
                        End With
                        'Falls der Zoomfaktor größer 1 ist müssen einige Ränder abgeschnitten werden
                        'Achtung Rotationszentrum ist auch Ausgangspunkt der bemalung


                        Grafikengine.ptfRotCenter.X = Bildgröße.Width / 2
                        If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.FireEmblem Then
                            Select Case Richtung
                                Case Richtungen.Rechts
                                    Grafikengine.ptfRotCenter.Y = Bildgröße.Height - Hauptmenü.Feldbreite / 2
                                Case Richtungen.Links
                                    Grafikengine.ptfRotCenter.Y = Bildgröße.Height - Hauptmenü.Feldbreite / 2
                                Case Else
                                    Grafikengine.ptfRotCenter.Y = Bildgröße.Height / 2
                            End Select
                        Else
                            Grafikengine.ptfRotCenter.Y = Bildgröße.Height / 2
                        End If



                        Grafikengine.ptfPosition = New Drawing.Point(Laufpunk.X + Objektverwalter.Spielfeld.BildschirmKooX, Laufpunk.Y + Objektverwalter.Spielfeld.BildschirmKooY)

                        'Ausschnitte in den Backbuffer zeichnen
                        'Wo wird das Bild gezeichnet
                        '16 ist die Breite eines Feldes 8 die Hälfte das heißt wir ermitteln den Mittelpunkt des Feldes und ziehen die Hälfte der Größe der Einheit ab
                        '... und wie breit ist es
                        With Grafikengine.szfScale
                            .Height = Bildgröße.Height
                            .Width = Bildgröße.Width
                        End With
                        Dim S As ObjektSpieler = Einheit.GetSpieler
                        'jetzt wird es in den Backbuffer gezeichnet
                        Grafikengine.Sprite.Draw2D(Objektverwalter.AlleEinheiten(Einheit.BildID).GetLauftextur(S.Armee), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                        Grafikengine.Sprite.Draw2D(Objektverwalter.AlleEinheiten(Einheit.BildID).GetLauftexturMaske(S.Armee), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, S.Farbe)
                    End If
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Bewegt die Einheit
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Laufen() As Boolean
        If Hauptmenü.Aufzeichnungsspulen Then
            ZumZielSetzen()
            Return True
        Else
            If Start = True Then
                Einheit.Frame = 1
                If WegX.Length > 0 Then
                    If Zielerreicht = False Then
                        If Fertigelaufen = False Then
                            If Zähler = 0 Then
                                Select Case Einheit.Bewegungsart
                                    Case MovementSorts.Reifen.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Reifen.wav", False)
                                    Case MovementSorts.Motorreifen.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Reifen.wav", False)
                                    Case MovementSorts.Ketten.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Ketten.wav", False)
                                    Case MovementSorts.Flugzeug.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Flugzeug.wav", False)
                                    Case MovementSorts.Helikopter.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Flugzeug.wav", False)
                                    Case MovementSorts.Höllium.ToString

                                    Case MovementSorts.Fuß.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Fuß.wav", False)
                                    Case MovementSorts.Mech.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Fuß.wav", False)
                                    Case MovementSorts.Amphibie.ToString

                                    Case MovementSorts.Läufer.ToString

                                    Case MovementSorts.Schiff.ToString

                                    Case MovementSorts.Transport.ToString
                                End Select
                                If IsNothing(Objektverwalter.Spielfeld.Einheiten(WegX(WegX.Length - 1), WegY(WegY.Length - 1), Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                    If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(WegX(WegX.Length - 1), WegY(WegY.Length - 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Team Then
                                        If Not Objektverwalter.Spielfeld.AktuelleEinheit.Bewegungsart = MovementSorts.Höllium.ToString Then
                                            Falle = True
                                            Fertiggelaufen()
                                            Return True
                                        End If
                                    End If
                                End If
                                If Position.X = WegX(WegX.Length - 1) Then
                                    'X ist gleich
                                    If Position.Y > WegY(WegY.Length - 1) Then
                                        Richtung = Richtungen.Oben
                                        Einheit.setRotation(Commander_Wars.Richtungen.Oben)
                                    ElseIf Position.Y < WegY(WegY.Length - 1) Then
                                        Richtung = Richtungen.Unten
                                        Einheit.setRotation(Commander_Wars.Richtungen.Unten)
                                    Else
                                        Return Fertiggelaufen()
                                    End If
                                ElseIf Position.Y = WegY(WegY.Length - 1) Then
                                    'X ist größer wir laufen nach Links
                                    If Position.X < WegX(WegX.Length - 1) Then
                                        Richtung = Richtungen.Rechts
                                        Einheit.setRotation(Commander_Wars.Richtungen.Rechts)
                                    ElseIf Position.X > WegX(WegX.Length - 1) Then
                                        Richtung = Richtungen.Links
                                        Einheit.setRotation(Commander_Wars.Richtungen.Links)
                                    End If
                                Else
                                    Return Fertiggelaufen()
                                End If
                            End If
                            Zähler += 1

                            Select Case Richtung
                                Case Richtungen.Links
                                    Laufpunk.X -= (Hauptmenü.Feldbreite) / ZählerZahl
                                Case Richtungen.Rechts
                                    Laufpunk.X += (Hauptmenü.Feldbreite) / ZählerZahl
                                Case Richtungen.Oben
                                    Laufpunk.Y -= (Hauptmenü.Feldbreite) / ZählerZahl
                                Case Richtungen.Unten
                                    Laufpunk.Y += (Hauptmenü.Feldbreite) / ZählerZahl
                            End Select
                            If Zähler >= ZählerZahl Then
                                'Wir sind fertig gelaufen
                                If WegX.Length = 1 Then
                                    Return Fertiggelaufen()
                                End If
                                Zähler = 0
                                Position = New Point(WegX(WegX.Length - 1), WegY(WegY.Length - 1))
                                Array.Resize(WegX, WegX.Length - 1)
                                Array.Resize(WegY, WegX.Length)
                            End If
                            Return False
                        Else
                            Return True
                        End If
                    Else
                        Return True
                    End If
                ElseIf Fertigelaufen = False Then
                    Array.Resize(WegX, 1)
                    Array.Resize(WegY, 1)
                    WegX(0) = Einheit.X
                    WegY(0) = Einheit.Y
                    Return Fertiggelaufen()
                Else
                    Return True
                End If
            End If
        End If
    End Function
    Public Sub ZumZielSetzen()
        Dim Max As Integer = WegX.Length - 1
        For I = 0 To Max
            If IsNothing(Objektverwalter.Spielfeld.Einheiten(WegX(WegX.Length - 1), WegY(WegY.Length - 1), Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(WegX(WegX.Length - 1), WegY(WegY.Length - 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Team Then
                    Falle = True
                    Fertiggelaufen()
                End If
            End If
            If Position.X = WegX(WegX.Length - 1) Then
                'X ist gleich
                If Position.Y > WegY(WegY.Length - 1) Then
                    Richtung = Richtungen.Oben
                    Einheit.setRotation(Commander_Wars.Richtungen.Oben)
                ElseIf Position.Y < WegY(WegY.Length - 1) Then
                    Richtung = Richtungen.Unten
                    Einheit.setRotation(Commander_Wars.Richtungen.Unten)
                Else
                    Fertiggelaufen()
                End If
            ElseIf Position.Y = WegY(WegY.Length - 1) Then
                'X ist größer wir laufen nach Links
                If Position.X < WegX(WegX.Length - 1) Then
                    Richtung = Richtungen.Rechts
                    Einheit.setRotation(Commander_Wars.Richtungen.Rechts)
                ElseIf Position.X > WegX(WegX.Length - 1) Then
                    Richtung = Richtungen.Links
                    Einheit.setRotation(Commander_Wars.Richtungen.Links)
                End If
            Else
                Fertiggelaufen()
            End If
            If WegX.Length = 1 Then
                Fertiggelaufen()
            End If
            Position = New Point(WegX(WegX.Length - 1), WegY(WegY.Length - 1))
            Array.Resize(WegX, WegX.Length - 1)
            Array.Resize(WegY, WegX.Length)
        Next
    End Sub

    Public Function Fertiggelaufen() As Boolean
        Zähler = 0

        If Falle = True Then
            Position = New Point(Position.X, Position.Y)
            Laufpunk.X = Position.X * Hauptmenü.Feldbreite
            Laufpunk.Y = Position.Y * Hauptmenü.Feldbreite
        Else
            Position = New Point(WegX(0), WegY(0))
            Laufpunk.X = Position.X * Hauptmenü.Feldbreite
            Laufpunk.Y = Position.Y * Hauptmenü.Feldbreite
        End If
        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Objektverwalter.Spielfeld.EingabenErlauben = True
        Else
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Dim RegenNebel As Boolean = False
        If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Or My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDS Then
            'In DS und DC müssen wir jetzt Nebel erzeugen.
            'Ich will aber nicht.
            'Hier geht es nicht um wollen sondern um die Regeln. Doof!
            If Objektverwalter.Spielfeld.Regeln.Wetter = ObjektSpielfeld.Wetterarten.Regen Then
                RegenNebel = True
            End If
        End If
        If Objektverwalter.Spielfeld.Regeln.Nebel > 0 Or RegenNebel Then
            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                Objektverwalter.Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.AktuelleEinheitPfeil.TreibstoffVerbrauch
            Else
                Objektverwalter.Spielfeld.AktuelleEinheit.Treibstoff = -Objektverwalter.Spielfeld.Wegsuchsystem.getBewegungspunktekosten(Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y)
            End If
        End If
        Fertigelaufen = True
        Return True
    End Function

    Public Function GetNextFeld() As Point
        Return New Point(WegX(WegX.Length - 1), WegY(WegY.Length - 1))
    End Function

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim L As ObjektLaufen = MemberwiseClone()
        L.Einheit = Einheit.Clone
        ReDim L.WegX(WegX.Length - 1)
        For i = 0 To WegX.Length - 1
            L.WegX(i) = WegX(i)
        Next
        ReDim L.WegY(WegY.Length - 1)
        For i = 0 To WegY.Length - 1
            L.WegY(i) = WegY(i)
        Next
        L.Position = New Point(Position.X, Position.Y)
        L.Laufpunk = New Point(Laufpunk.X, Laufpunk.Y)
        Return L
    End Function
End Class
''' <summary>
''' Bewegt eine Einheit von einem Feld zu einem anderen
''' </summary>
''' <remarks></remarks>
Public Class AnimationLaufen
    Dim Start As Boolean = False
    Public Falle As Boolean = False
    Dim Zähler As Integer = 0
    Dim Richtung As Richtungen
    Dim Bildgröße As Rectangle
    Public Zielerreicht As Boolean = False
    Dim Fertigelaufen As Boolean = False
    Dim Farbe As Color
    Enum Richtungen
        Unten
        Oben
        Rechts
        Links
    End Enum
    Dim Einheit As ObjektEinheit
    Dim WegX() As Integer
    Dim WegY() As Integer
    Public Position As Point
    Dim Laufpunk As Point
    Dim OhneSound As Boolean = False
    Public Visible As Boolean = True
    Dim Armee As String
    Public Sub New(ByVal neuEinheit As ObjektEinheit, ByVal Armee As String, ByVal Farbe As Bitmap, ByVal neuWegX() As Integer, ByVal neuWegY() As Integer, ByVal neuPosition As Point, Optional ByVal OhneSound As Boolean = True)
        Me.New(neuEinheit, Armee, Farbe.GetPixel(7, 0), neuWegX, neuWegY, neuPosition, OhneSound)
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="neuEinheit"></param>
    ''' <param name="neuWegX">Mit dem Startpunkt wird in der Tine gelöscht</param>
    ''' <param name="neuWegY">Mit dem Startpunkt wird in der Tine gelöscht</param>
    ''' <param name="neuPosition">In Feldern wird in der Tine Hochgerechnet</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal neuEinheit As ObjektEinheit, ByVal Armee As String, ByVal Farbe As Color, ByVal neuWegX() As Integer, ByVal neuWegY() As Integer, ByVal neuPosition As Point, Optional ByVal OhneSound As Boolean = True)
        Me.OhneSound = OhneSound
        Einheit = neuEinheit
        WegX = neuWegX
        WegY = neuWegY
        Array.Resize(WegX, WegX.Length - 1)
        Array.Resize(WegY, WegX.Length)
        Position = neuPosition
        Laufpunk.X = Position.X * Hauptmenü.Feldbreite
        Laufpunk.Y = Position.Y * Hauptmenü.Feldbreite
        Me.Farbe = Farbe
        Me.Armee = Armee
        Bildgröße.Size = Objektverwalter.AlleEinheiten(neuEinheit.BildID).GetBildgröße(Armee)
        Start = True

        '     Laufen()
    End Sub
    Public Sub NeuerWeg(ByVal WX As Integer(), ByVal WY As Integer())
        Start = False
        Falle = False
        Zähler = 0
        Zielerreicht = False
        Fertigelaufen = False
        WegX = WX
        WegY = WY
        Laufpunk.X = Position.X * Hauptmenü.Feldbreite
        Laufpunk.Y = Position.Y * Hauptmenü.Feldbreite
        Start = True
    End Sub
    Public Sub Einheitmalen()

        If Start = True Then
            If Visible Then

                'Welchen Teil des Bildes wir malen wollen
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
                'prüfen ob wir aus den Screenbereich laufen

                'Festlegen welchen Bereich vom Bitmap wir kopieren

                'Welcher Teil der Textur soll gemalt werden Nichts bedeutet gesamtes Bild

                With Grafikengine.recBild
                    .X = Bildgröße.Width * Einheit.Frame : .Width = Bildgröße.Width
                    .Y = Bildgröße.Height * Richtung : .Height = Bildgröße.Height
                End With
                'Falls der Zoomfaktor größer 1 ist müssen einige Ränder abgeschnitten werden
                'Achtung Rotationszentrum ist auch Ausgangspunkt der bemalung
                With Grafikengine.ptfRotCenter
                    .X = Bildgröße.Width / 2
                    .Y = Bildgröße.Height / 2
                End With

                Grafikengine.ptfPosition = New Drawing.Point(Laufpunk.X, Laufpunk.Y)

                'Ausschnitte in den Backbuffer zeichnen
                'Wo wird das Bild gezeichnet
                '16 ist die Breite eines Feldes 8 die Hälfte das heißt wir ermitteln den Mittelpunkt des Feldes und ziehen die Hälfte der Größe der Einheit ab
                '... und wie breit ist es
                With Grafikengine.szfScale
                    .Height = Bildgröße.Height
                    .Width = Bildgröße.Width
                End With
                If Objektverwalter.AlleEinheiten(Einheit.BildID).GetLauftextur(Armee) IsNot Nothing Then
                    'jetzt wird es in den Backbuffer gezeichnet
                    Grafikengine.Sprite.Draw2D(Objektverwalter.AlleEinheiten(Einheit.BildID).GetLauftextur(Armee), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Objektverwalter.AlleEinheiten(Einheit.BildID).GetLauftexturMaske(Armee) IsNot Nothing Then
                    Grafikengine.Sprite.Draw2D(Objektverwalter.AlleEinheiten(Einheit.BildID).GetLauftexturMaske(Armee), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, Farbe)
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Bewegt die Einheit
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Laufen() As Boolean
        If Start = True Then
            Einheit.Frame = 1
            If WegX.Length > 0 Then
                If Zielerreicht = False Then
                    If Fertigelaufen = False Then
                        If Zähler = 0 And Position.X = WegX(WegX.Length - 1) And Position.Y = WegY(WegY.Length - 1) Then
                            If Not OhneSound Then
                                Select Case Einheit.Bewegungsart
                                    Case MovementSorts.Reifen.tostring
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Reifen.wav", False)
                                    Case MovementSorts.Motorreifen.ToString
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Reifen.wav", False)
                                    Case MovementSorts.Ketten.tostring
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Ketten.wav", False)
                                    Case MovementSorts.Flugzeug.tostring
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Flugzeug.wav", False)
                                    Case MovementSorts.Helikopter.tostring
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Flugzeug.wav", False)
                                    Case MovementSorts.Höllium.tostring

                                    Case MovementSorts.Fuß.tostring
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Fuß.wav", False)
                                    Case MovementSorts.Mech.tostring
                                        MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Fuß.wav", False)
                                    Case MovementSorts.Amphibie.tostring

                                    Case MovementSorts.Läufer.tostring

                                    Case MovementSorts.Schiff.tostring

                                    Case MovementSorts.Transport.tostring
                                End Select
                            End If
                            Array.Resize(WegX, WegX.Length - 1)
                            Array.Resize(WegY, WegX.Length)
                            If WegX.Length > 0 Then
                                If Position.X = WegX(WegX.Length - 1) Then
                                    'X ist gleich
                                    If Position.Y > WegY(WegY.Length - 1) Then
                                        Richtung = Richtungen.Oben
                                    ElseIf Position.Y < WegY(WegY.Length - 1) Then
                                        Richtung = Richtungen.Unten
                                    Else
                                        Return Fertiggelaufen()
                                    End If
                                ElseIf Position.Y = WegY(WegY.Length - 1) Then
                                    'X ist größer wir laufen nach Links
                                    If Position.X < WegX(WegX.Length - 1) Then
                                        Richtung = Richtungen.Rechts
                                    ElseIf Position.X > WegX(WegX.Length - 1) Then
                                        Richtung = Richtungen.Links
                                    End If
                                Else
                                    Return Fertiggelaufen()
                                End If
                            Else
                                Return Fertiggelaufen()
                            End If
                        End If
                        Zähler += 1
                        Select Case Richtung
                            Case Richtungen.Links
                                Laufpunk.X -= (Hauptmenü.Feldbreite) / 4
                            Case Richtungen.Rechts
                                Laufpunk.X += (Hauptmenü.Feldbreite) / 4
                            Case Richtungen.Oben
                                Laufpunk.Y -= (Hauptmenü.Feldbreite) / 4
                            Case Richtungen.Unten
                                Laufpunk.Y += (Hauptmenü.Feldbreite) / 4
                        End Select
                        If Zähler >= 4 Then
                            'Wir sind fertig gelaufen
                            If WegX.Length = 0 Then
                                Return Fertiggelaufen()
                            End If
                            Zähler = 0
                            Position.X = Laufpunk.X / Hauptmenü.Feldbreite
                            Position.Y = Laufpunk.Y / Hauptmenü.Feldbreite
                        End If
                        Return False
                    Else
                        Return True
                    End If
                Else
                    Return True
                End If
            ElseIf Fertigelaufen = False Then
                Array.Resize(WegX, 1)
                Array.Resize(WegY, 1)
                WegX(0) = Einheit.X
                WegY(0) = Einheit.Y
                Return Fertiggelaufen()
            Else
                Return True
            End If
        End If
    End Function
    Public Sub ZumZielSetzen()
        Dim Max As Integer = WegX.Length - 1
        For I = 0 To Max
            If Position.X = WegX(WegX.Length - 1) Then
                'X ist gleich
                If Position.Y > WegY(WegY.Length - 1) Then
                    Richtung = Richtungen.Oben
                ElseIf Position.Y < WegY(WegY.Length - 1) Then
                    Richtung = Richtungen.Unten
                Else
                    Fertiggelaufen()
                End If
            ElseIf Position.Y = WegY(WegY.Length - 1) Then
                'X ist größer wir laufen nach Links
                If Position.X < WegX(WegX.Length - 1) Then
                    Richtung = Richtungen.Rechts
                ElseIf Position.X > WegX(WegX.Length - 1) Then
                    Richtung = Richtungen.Links
                End If
            Else
                Fertiggelaufen()
            End If
            If WegX.Length = 1 Then
                Fertiggelaufen()
            End If
            Position = New Point(WegX(WegX.Length - 1), WegY(WegY.Length - 1))
            Array.Resize(WegX, WegX.Length - 1)
            Array.Resize(WegY, WegX.Length)
        Next
    End Sub

    Public Function Fertiggelaufen() As Boolean
        Zähler = 0

        'If Falle = True Then
        '    Position = New Point(Position.X, Position.Y)
        '    Laufpunk.X = Position.X * Feldbreite
        '    Laufpunk.Y = Position.Y * Feldbreite
        'Else
        '    Position = New Point(WegX(0), WegY(0))
        '    Laufpunk.X = Position.X * Feldbreite
        '    Laufpunk.Y = Position.Y * Feldbreite
        'End If
        Fertigelaufen = True
        Return True
    End Function

    Public Function GetNextFeld() As Point
        Return New Point(WegX(WegX.Length - 1), WegY(WegY.Length - 1))
    End Function
End Class